package com.example.springboot.entity;

import com.example.springboot.entity.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
//生成树的工具类
public class MakeTree {
    /**
     * 构建菜单树的方法。
     *
     * @param menuList 所有菜单项的列表
     * @param pid      当前层级的父ID
     * @return 构建好的菜单树列表
     */
    public static List<SysMenu> makeMenuTree(List<SysMenu> menuList, Long pid) {
        // 创建一个列表来存储当前层级的菜单项
        List<SysMenu> list = new ArrayList<>();

        // 如果 menuList 为 null，则使用空列表；否则使用 menuList
        Optional.ofNullable(menuList).orElse(new ArrayList<>())
                // 将列表转换为流以便进行过滤和处理
                .stream()
                // 过滤出 parentId 与给定 pid 匹配的菜单项
                .filter(item -> item != null && item.getParentId() == pid)
                // 对每个匹配的菜单项进行处理
                .forEach(dom -> {
                    // 创建一个新的 SysMenu 对象用于存储当前菜单项的数据
                    SysMenu menu = new SysMenu();
                    // 将 dom 对象的属性复制到 menu 对象中
                    BeanUtils.copyProperties(dom, menu);

                    // 递归调用 makeMenuTree 以构建子菜单项
                    List<SysMenu> children = makeMenuTree(menuList, dom.getId());
                    // 将子菜单项设置为当前菜单项的 children 属性
                    menu.setChildren(children);

                    // 将构建好的菜单项添加到当前层级的列表中
                    list.add(menu);
                });

        // 返回构建好的菜单树列表
        return list;
    }
    //组装路由数据
    public static List<RouterVo> makeRouter(List<SysMenu> menuList, Long pid) {
        // 定义接收组装结果的集合
        List<RouterVo> list = new ArrayList<>();

        // 使用Optional避免空指针，如果menuList为null则使用空列表
        Optional.ofNullable(menuList).orElse(new ArrayList<>())
                // 转换为流处理
                .stream()
                // 过滤：保留非空且父ID匹配的菜单项
                .filter(item -> item != null && item.getParentId() == pid)
                // 遍历处理每个符合条件的菜单项
                .forEach(item -> {
                    // 创建路由VO对象
                    RouterVo routerVo = new RouterVo();

                    // 设置路由基本属性
                    routerVo.setName(item.getName());  // 路由名称
                    routerVo.setPath(item.getPath());  // 路由路径

                    // 判断是否为一级菜单（父ID为0）
                    if (item.getParentId() == 0L) {
                        routerVo.setComponent("Layout");  // 一级菜单使用Layout组件
                        routerVo.setAlwaysShow(true);    // 一级菜单始终显示
                    } else {
                        routerVo.setComponent(item.getUrl());  // 子菜单使用具体组件路径
                        routerVo.setAlwaysShow(false);   // 子菜单不强制显示
                    }

                    // 设置路由元信息
                    routerVo.setMeta(routerVo.new Meta(
                            item.getTitle(),       // 菜单标题
                            item.getIcon(),       // 菜单图标
                            item.getCode().split(","),  // 权限代码（按逗号分割）
                            item.getOrderNum()    // 排序号
                    ));

                    // 递归处理子菜单：查找当前菜单的所有子菜单
                    List<RouterVo> children = makeRouter(menuList, item.getId());
                    routerVo.setChildren(children);  // 设置子路由

                    // 如果有子菜单，则设置alwaysShow为true（保持父菜单一直展开）
                    if (routerVo.getChildren().size() > 0) {
                        routerVo.setAlwaysShow(true);
                    }

                    // 将构建好的路由对象加入结果列表
                    list.add(routerVo);
                });

        return list;
    }
}
